package cn.com.open.itembank.service;

import cn.com.open.itembank.dto.*;
import cn.com.open.itembank.common.enums.AnswerType;

import java.util.List;
import java.util.Map;

/**
 * Created by lucky on 2017/10/30.
 */
public interface PaperService {

    /**
     * 获得指定题库下指定试卷的试卷模型.
     *
     * @param itemBankId 题库id
     * @param id         试卷id
     * @param answerType 获取答案类型：0，全部；1，试题；2，答案
     * @param makeJson   是否用来获取试卷json（忽略type）
     * @return 试题模型 return model
     */
    ReturnModel getTestPaper(String itemBankId, String id, AnswerType answerType, boolean makeJson);

    //region 查询相关

    //region 获取所有试卷列表

    /**
     * 获取所有试卷列表.
     *
     * @param itemBankId         the item bank id
     * @param testPaperSearchDto the test paper dto
     * @return the paper list
     */
    ReturnModel getPaperList(String itemBankId, TestPaperSearchDto testPaperSearchDto);

    //endregion

    //endregion

    //region 更新相关

    //region 切换试卷状态

    /**
     * 切换试卷状态
     *
     * @param appKey     appKey
     * @param itemBankId 题库id
     * @param id         试卷id
     * @return the return model
     */
    ReturnModel updateStatus(String itemBankId, String id, String appKey);

    //endregion

    //region 试卷名称更改

    /**
     * 试卷名称更改.
     *
     * @param appKey        appKey
     * @param itemBankId    题库id
     * @param id            试卷id
     * @param testPaperName 试卷名称
     * @return the return model
     */
    ReturnModel updateTestPaperName(String itemBankId, String id, String testPaperName, String appKey);
    //endregion

    //region 发布试卷

    /**
     * 发布试卷.
     *
     * @param itemBankId 题库id
     * @param id         试卷id
     * @param publisher  发布者
     * @param appKey     appKey
     * @return the return model
     */
    ReturnModel testPaperRelease(String itemBankId, String id, String publisher, String appKey);

    //endregion

    //region 取消试卷发布

    /**
     * 取消试卷发布.
     *
     * @param itemBankId 题库id
     * @param id         试卷id
     * @param appKey     appKey
     * @return the return model
     */
    ReturnModel cancelTestPaperRelease(String itemBankId, String id, String appKey);

    //endregion

    //endregion

    //region 新增相关

    //region 试卷主体新增

    /**
     * Add paper return model.
     *
     * @param itemBankId    the itemBank Id
     * @param paperModel the paper add model
     * @param appKey        the app key
     * @return the return model
     */
    ReturnModel addPaper(String itemBankId, PaperModel paperModel, String appKey);
    //endregion

    //region  试卷复制

    /**
     * Copy test paper return model.
     *
     * @param itemBankId the item bank id
     * @param oldId      the old id
     * @param newId      the new id
     * @param appKey     the app key
     * @return the return model
     */
    ReturnModel copyTestPaper(String itemBankId, String oldId, String newId, String appKey);

    //endregion

    //region 试卷导入

    /**
     * 试卷导入.
     *
     * @param importParameter the import parameter
     * @return the return model
     */
    public ReturnModel importPaper(ImportParameter importParameter);
    //endregion

    //region 跨题库批量复制试卷

    /**
     * 跨题库批量复制试卷.
     *
     * @param sourceItembankId 原题库id
     * @param targetItemBankId 目标题库id
     * @param targetOrgId      目标题库机构id
     * @param testPaperMap  旧新试题id的map
     * @return the map
     */
    Map<String, String> copyCrossItemBank(String sourceItembankId, String targetItemBankId, String targetOrgId, Map<String, String> testPaperMap);
    //endregion

    //endregion

    //region 删除相关

    //region 试卷删除(默认删除是自动取消发布后删除)

    /**
     * 试卷删除(默认删除是自动取消发布后删除)
     * @param itemBankId 题库ID
     * @param id 试卷id
     * @param isAutoDelete 是否自动删除： true 表示会自动取消发布后删除
     * @param appKey 所属AppKey
     * @return
     */
    ReturnModel deleteAuto(String itemBankId, String id, boolean isAutoDelete, String appKey);

    //endregion

    //endregion

    //region 大题相关

    //region 大题自身删除

    /**
     * 大题自身删除
     *
     * @param itemBankId the item bank id
     * @param id         试卷id
     * @param index      大题序号
     * @param appKey     appKey
     * @return return model
     */
    ReturnModel removeSection(String itemBankId, String id, String index, String appKey);

    //endregion

    //region 大题所含试题删除

    /**
     * 大题所含试题删除
     *
     * @param itemBankId the item bank id
     * @param id         试卷id
     * @param index      大题序号
     * @param questionId 试卷id
     * @param appKey     appKey
     * @return return model
     */
    ReturnModel removeSectionQuestion(String itemBankId, String id, String index, String questionId, String appKey);
    //endregion

    //region 大题批量试题删除

    /**
     * 大题所含试题删除
     *
     * @param itemBankId the item bank id
     * @param id         试卷id
     * @param questionIdList 试卷id集合
     * @param appKey     appKey
     * @return return model
     */
    ReturnModel removeSectionQuestionList(String itemBankId, String id, List<String> questionIdList, String appKey);
    //endregion

    // region 大题内容修改

    /**
     * 大题内容修改
     *
     * @param itemBankId   题库id
     * @param id           试卷id
     * @param index        大题序号
     * @param sectionTitle 大题名称
     * @param shuf         是否乱序
     * @param appKey       appKey
     * @return return model
     */
    ReturnModel updateSectionContent(String itemBankId, String id, String index, String sectionTitle, boolean shuf, String appKey);
    //endregion

    // region 大题试题分值修改

    /**
     * 大题试题分值修改
     *
     * @param itemBankId 题库id
     * @param id         试卷id
     * @param index      大题序号
     * @param questionId 试题id
     * @param score      试题分值
     * @param appKey     appKey
     * @return return model
     */
    ReturnModel updateSectionQuestionScore(String itemBankId, String id, String index, String questionId, double score, String appKey);
    //endregion

    // region 大题所有试题分值修改

    /**
     * 大题所有试题分值修改
     *
     * @param itemBankId 题库id
     * @param id         试卷id
     * @param index      大题序号
     * @param score      试题分值
     * @param appKey     appKey
     * @return return model
     */
    ReturnModel updateSectionScore(String itemBankId, String id, String index, double score, String appKey);
    //endregion

    //region 大题顺序调整

    /**
     * 大题顺序调整
     *
     * @param itemBankId 题库id
     * @param id         试卷id
     * @param index      大题序号
     * @param m          上移/下移
     * @param appKey     appKey
     * @return return model
     */
    ReturnModel updateSectionOrder(String itemBankId, String id, String index, boolean m, String appKey);

    //endregion

    //region 大题试题顺序调整

    /**
     * 大题试题顺序调整
     *
     * @param itemBankId 题库id
     * @param id         试卷id
     * @param index      大题序号
     * @param questionId 试题id
     * @param m          上移/下移
     * @param appKey     appKey
     * @return return model
     */
    ReturnModel updateSectionQuestionOrder(String itemBankId, String id, String index, String questionId, boolean m, String appKey);

    //endregion

    //region 大题关联新增

    /**
     * 大题关联新增
     *
     * @param itemBankId 题库id
     * @param id         试卷id
     * @param questionId 试题id
     * @param shuf       是否乱序
     * @param score      分数
     * @param appKey     appkey
     * @return return model
     */
    ReturnModel addSectionQuestion(String itemBankId, String id, String questionId, boolean shuf, double score, String appKey);

    //endregion

    //region 大题批量试题关联新增

    /**
     * 大题批量试题关联新增
     *
     * @param itemBankId     题库id
     * @param id             试卷id
     * @param questionIdList 试题id集合
     * @param score          分数
     * @param appKey         appkey
     * @return return model
     */
    ReturnModel addExistQuestionList(String itemBankId, String id, List<String> questionIdList, double score, String appKey);

    //endregion

    //region 大题试题修改

    /**
     * 大题试题修改
     *
     * @param itemBankId    题库ID
     * @param id            试卷ID
     * @param index         大题序号
     * @param questionId    试题id
     * @param copy          是否复制
     * @param questionModel 试题模型
     * @param appKey        所属AppKey
     * @return return model
     */
    ReturnModel updateSectionQuestion(String itemBankId, String id, String index, String questionId, Boolean copy, QuestionModel questionModel,
                                      String appKey);

    //endregion

    //region 大题试题新增

    /** 大题试题新增
     * @param itemBankId 题库id
     * @param id         试卷id
     * @param questionModel 试题模型
     * @param shuf       是否乱序
     * @param score      分数
     * @param appKey     appkey
     * @return
     */
    ReturnModel addSectionQuestioninsert(String itemBankId, String id, QuestionModel questionModel, boolean shuf, double score, String appKey);

    //endregion

    //endregion
}
